﻿/*
 * Twipler - Twitter Web Client with features.
 *  
 *  Copyright (C) 2009, 2010. Ian Quigley
 * 
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details. 
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>. 
 */

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using Twipler.App.Parse.Html.Consumers;
using Twipler.Xtensions;

namespace Twipler.App.Parse.Html
{
    public class ConsumerFactory
	{
        public static List<KeyValuePair<string, Type>> Consumers;
        
        static ConsumerFactory()
        {
            IEnumerable<Type> types = Assembly.GetExecutingAssembly().GetTypes(typeof (TemplateConsumer));
            
            Consumers = new List<KeyValuePair<string,Type>>();

            foreach (Type t in types)
            {
                ConsumerAttribute[] attributes = (ConsumerAttribute[])
                                                    t.GetCustomAttributes(typeof(ConsumerAttribute), true);
                if (attributes.Count() != 1)
                    continue;

                Consumers.Add(new KeyValuePair<string,Type>(attributes[0].OpenTag.ToLower(), t));   
            }
        }

        public static TemplateConsumer Create(string name)
        {
            name = name.ToLower();

            Type type = Consumers.FirstOrDefault(c => c.Key == name).Value;

            if (type == null)
                return null;

            return (TemplateConsumer) Activator.CreateInstance(type);            
        }
	}
}
